//头函数，全局函数区域
#include<stdio.h>


//程序1
//指针数组的应用;


/*
	指针数组：指针数组是一个数组，每个数组元素存放一个指针变量。
	int *p1[5]

	下标		0		1		2		3		4
	元素		int*	int*	int*	int*	int*

	例如：int *p1[5];根据关系运算符结合性，[]结合性比*大,所以先结合[]再结合*。
	数组下标的优先级要比取值运算符的优先级高，所以先入为主，p1 被定义为具有 5 个元素的数组。
	那么数组元素的类型呢？是整型吗？显然不是，因为还有一个星号，所以它们应该是指向整型变量的指针。也就是一个数组存放5个指向整型变量的指针

*/


void test1()
{
	const char* array[5] = { "FishC","Five","Star","Good","WoW" };//
	//可能对这里产生疑惑，小甲鱼的代码明明是char* array[5] = {},那是因为你将字符常量直接赋值给char*array[]，在C++语法规则这种写法是不安全的，C语法规则是合法的（你要使用Code：Block验证就可以，或者把文件类型改为.c后缀）
	//在VS2017版本中使用这种char* 的表达方式会造成程序崩溃，
	// 所以VS2017对其进行了控件管理,所以如果你要使用数组指针数组的话就得加上const
	// 或者就是用传统的表示方法：
	/*
		char array2[5][10] = {"FishC","Five","Star","Good","WoW"};
		char* p = array2[0];
		哎，是不是有点新奇，它怎么和二维数组搭起来了。没错：指针数组的本意就是二维数组
	*/
	const char *(*p)[5] = &array;//&array整个数组的地址（这个数组又是存放指针）
	//char *(*pa)[5]这是个啥玩意，它是一个指向'数组指针'的指针，看看这个
	// 举个例子
	/*	
		结合性从左到右, 所以 p 先被定义成一个指针变量。
		指向一个具有5个元素的数组，p就指向它，数组类型是 char *，即指向5个char *类型元素的数组的指针(套娃)，
		&array是取出整个数组的地址

		最高层（指针）							*P
			|
			|	指向
			V					
		第二层（数组）			下标		0		1		2		3		4
								元素		char*	char*	char*	char*	char*		

	

		
	*/

	
	/*	
		或许你也会头晕，数组指针又是个啥玩意
		数组指针：数组指针是一个指针，它指向的是一个数组。
		int (*p1)[5];

			指向				下标		0		1		2		3		4			
		p1 ------> 数组	
							元素		int		int		int		int		int		
		

		举个例子
		int temp[5] = {1, 2, 3, 4, 5};
		int (*p2)[5] = &temp;

		就相当于一个指针指向一个数组(这是指向整个元素)，感觉是不是和之前学的'指针和数组'有点类似？

		数组指针是一个指针指向整个数组(把整个数组看出一个整体)
		int (*p2)[5]定义了一个数组指针 p2 ，指向含有5个 int 类型元素的数组;

		我们上节课学的
		int array[5] = {1,2,3,4,5};
		int *p = array;
		这里的 指针p 指向array数组的第一个元素地址（数组名）

		 ！！！注意：指向数组和指向数组首元素的地址是两码事

		他们类型不同：
		假设
		int arr[5];
		int *p = arr，是指向首地址元素指针，p 类型是 int*。
		int (*p)[5] = &arr，是指向整个数组的指针，p 类型是 int (*)[5]。

		运算不同：
		指向首地址指针移动按所指数据类型大小，如 int *p移动一步,地址+4(int 类型占4字节)
		数组指针移动按照整个数组的大小，如 int(*p)[5]移动一步,地址+20(int类型占4个字节,数组占5个宽度，5*4)

		他们都能访问数组中的元素,指向首地址的指针用 *(p + i)<用for（int i = 0；i<5,i++）递增>或者p[i]访问;数组指针用（*q）[i]访问
		例如：
			int arr[5] = {1, 2, 3, 4, 5};
			int *p = arr;
			for (int i = 0; i < 5; i++) {
				printf("%d ", *(p + i));
			}

			int (*p)[5] = &arr;
			printf("\n");
			for (int i = 0; i < 5; i++) {
				printf("%d ", (*q)[i]);
			}
			return 0;
	*/


}

int main()
{
	test1();
	return 0;
}